package com.hzqiuxm.tdddemo001.junit5demo.mokito;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.Map;

import static org.mockito.Mockito.*;

/**
 * Copyright © 2021年 tdd-demo-001. All rights reserved.
 *
 * @author 临江仙 hzqiuxm@163.com
 * Mock的验证操作
 * 1 由程序员自己来决定验证结果，可以关注调用参数、返回结果、调用次数(times(0))
 * 2 verify 也可以像when 那样使用模拟参数，若方法中的某一个参数使用了matcher，则所有的参数都必须使用matcher
 * @date 2021/2/23 11:13
 */
@DisplayName("Mock的验证操作")
public class MockVerify {

    @DisplayName("验证传入参数正确性")
    @Test
    void test1_verify_normal(){
        List mockList = mock(List.class);

        mockList.add("临江仙");
        mockList.add("菩萨蛮");

        verify(mockList).add("临江仙"); // 如果times不传入，则默认是1
    }

    @DisplayName("验证调用结果")
    @Test
    void test2_verify_param(){
        Map mockMap = mock(Map.class);
        when(mockMap.get("player")).thenReturn("临江仙");

        System.out.println(mockMap.get("player"));

        // 关注是否有参数传入，注意这个次数只有1次
        verify(mockMap,times(1)).get(eq("player"));

    }


    @DisplayName("验证调用的次数")
    @Test
    void test3_verify_times(){
        Map mockMap = mock(Map.class);
        when(mockMap.get("player")).thenReturn("临江仙");
        mockMap.get("player");
        mockMap.get("player");
        mockMap.get("player");
        // 关注调用次数
        verify(mockMap, times(3)).get(eq("player"));
    }

}
